﻿///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Область ОписаниеПеременных

&НаКлиенте
Перем ПараметрыПодключаемогоОбработчика;

#КонецОбласти

#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	УстановитьУсловноеОформление();
	
	ЗапускИзКонфигурации = Параметры.ЗапускИзКонфигурации;
	ЕстьИдентификаторыОбъектовМетаданных = Метаданные.Справочники.Найти("ИдентификаторыОбъектовМетаданных") <> Неопределено;
	
	МассивПорядка = Новый Массив;
	МассивПорядка.Добавить(НСтр("ru = 'Текущий'"));
	МассивПорядка.Добавить(НСтр("ru = 'Конфликтующий'"));
	МассивПорядка.Добавить(НСтр("ru = 'Любой'"));
	
	Элементы.ПриоритетыВыполненияВыборПорядкаВыполнения.СписокВыбора.ЗагрузитьЗначения(МассивПорядка);
	
	Представление = Новый Соответствие;
	Представление.Вставить("До", МассивПорядка[0]);
	Представление.Вставить("После", МассивПорядка[1]);
	Представление.Вставить("Любой", МассивПорядка[2]);
	ПредставлениеПорядка = Новый ФиксированноеСоответствие(Представление);
	
	ЗаполнитьСоответствияМодуля(МассивПорядка);
	Модифицированность = Параметры.НоваяСтрока;
	
	Если НЕ ПустаяСтрока(Параметры.АдресОбработчика) Тогда
		
		Данные = ПолучитьИзВременногоХранилища(Параметры.АдресОбработчика);
		Объект["ОбработчикиОбновления"].Загрузить(Данные.ТабличныеЧасти.ОбработчикиОбновления);
		Если Данные.ТабличныеЧасти.Свойство("КонфликтыОбработчиков") Тогда
			Объект["КонфликтыОбработчиков"].Загрузить(Данные.ТабличныеЧасти.КонфликтыОбработчиков);
		КонецЕсли;
		
		СсылкаТекущегоОбработчика = Объект.ОбработчикиОбновления[0].Ссылка;
		ПроцедураОбработки = Объект.ОбработчикиОбновления[0].Процедура;
		ТекущееЗначениеПроцедурыПроверки = Объект.ОбработчикиОбновления[0].ПроцедураПроверки;
		ИзмененаПроцедураПроверки = Объект.ОбработчикиОбновления[0].ИзмененаПроцедураПроверки;
		Если НЕ ПустаяСтрока(ПроцедураОбработки) Тогда
			Заголовок = ПроцедураОбработки;
			АвтоЗаголовок = Ложь;
		КонецЕсли;
		ОсновнойОбъектМетаданных = ИмяОсновногоОбъектаМетаданных(Объект.ОбработчикиОбновления[0].Процедура, ЕдинственноеЧисло, МножественноеЧисло);
		Элементы.Обработчик1.РасширеннаяПодсказка.Заголовок = Объект.ОбработчикиОбновления[0].Комментарий;
		
		СодержитОбъектМетаданных = Новый Структура("ЧитаемыеОбъекты,ИзменяемыеОбъекты,БлокируемыеОбъекты");
		Для Каждого ТабличнаяЧасть Из Данные.ТабличныеЧасти Цикл
			Если СодержитОбъектМетаданных.Свойство(ТабличнаяЧасть.Ключ) Тогда
				Для Каждого СтрокаТЧ Из ТабличнаяЧасть.Значение Цикл
					НоваяСтрока = Объект[ТабличнаяЧасть.Ключ].Добавить();
					ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаТЧ);
					НоваяСтрока.ИндексКартинки = ИндексКартинки(СтрокаТЧ.ОбъектМетаданных);
				КонецЦикла;
				Объект[ТабличнаяЧасть.Ключ].Сортировать("ОбъектМетаданных");
				
			ИначеЕсли СтрНайти(ТабличнаяЧасть.Ключ, "ПриоритетыВыполнения") > 0 Тогда
				ЗагрузитьПриоритетыОбработчика(ТабличнаяЧасть.Значение);
				
			ИначеЕсли СтрНайти(ТабличнаяЧасть.Ключ, "ЧтениеНизкогоПорядка") > 0 Тогда
				ЗагрузитьЧтениеНизкогоПорядка(ТабличнаяЧасть.Значение);
				
			ИначеЕсли СтрНайти(ТабличнаяЧасть.Ключ, "КонфликтыОбработчиков") = 0 Тогда
				Объект[ТабличнаяЧасть.Ключ].Загрузить(ТабличнаяЧасть.Значение);
				
			КонецЕсли;
		КонецЦикла;
		
		МодулиПодсистем = Данные.МодулиПодсистем;
		ПереданСписокМодулейОбновления = МодулиПодсистем <> Неопределено;
		Элементы.ИмяОсновногоСерверногоМодуля.Видимость = НЕ ПереданСписокМодулейОбновления;
		Если ПереданСписокМодулейОбновления Тогда
			Список = Элементы.Подсистема.СписокВыбора;
			Для Каждого Подсистема Из МодулиПодсистем Цикл
				Список.Добавить(Подсистема.Ключ);
			КонецЦикла;
			Список.СортироватьПоЗначению(НаправлениеСортировки.Убыв);
		КонецЕсли;

		Если ЗначениеЗаполнено(Объект.ОбработчикиОбновления[0].Подсистема) Тогда
			Объект.ОбработчикиОбновления[0].ИмяОсновногоСерверногоМодуля = МодулиПодсистем[Объект.ОбработчикиОбновления[0].Подсистема];
		КонецЕсли;
		Элементы.ИмяОсновногоСерверногоМодуля.Видимость = НЕ ЗначениеЗаполнено(Объект.ОбработчикиОбновления[0].ИмяОсновногоСерверногоМодуля);
		
	Иначе
		Объект["ОбработчикиОбновления"].Добавить();
	КонецЕсли;
	
	УстановитьОтметкуНезаполненногоМонопольногоОбработчика();
	УстановитьОтметкуНезаполненногоПроцедураПроверки();
	
	ЗаполнитьОбщиеМодули();
	
	Элементы.ДекорацияПредупреждение.Видимость = ИзмененаПроцедураПроверки;
	
КонецПроцедуры

&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
	
	Если Модифицированность Тогда
		Отказ = Истина;
		ОбработчикОтвета = Новый ОписаниеОповещения("ЗавершениеЗакрытияФормы", ЭтотОбъект);
		ПоказатьВопрос(ОбработчикОтвета, НСтр("ru = 'Данные были изменены. Сохранить изменения?'"), РежимДиалогаВопрос.ДаНетОтмена);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ЗавершениеЗакрытияФормы(Результат, ДополнительныеПараметры) Экспорт
	
	Адрес = Неопределено;
	Если Результат = КодВозвратаДиалога.Да Тогда
		
		Если НЕ ПроверитьЗаполнение() Тогда
			Возврат;
		КонецЕсли;
		
		Адрес = ПоместитьДанныеОбработчикаВХранилище(ВладелецФормы.УникальныйИдентификатор);
		Модифицированность = Ложь;
		Закрыть(Адрес);
		
	ИначеЕсли Результат = КодВозвратаДиалога.Отмена Тогда
		// Ничего не делаем
	Иначе
		Модифицированность = Ложь;
		Закрыть(Адрес);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
	
	Если ИмяСобытия = "ОбновленыДанныеОКонфликтахОбработчикаОбновления" Тогда
		ОбновитьДанныеОКонфликтахОбработчика(Параметр);
		Модифицированность = Ложь;
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовШапкиФормы

&НаКлиенте
Процедура ОсновнойОбъектМетаданныхНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	ВыборОбъектаМетаданных(Элемент, ОсновнойОбъектМетаданных);

КонецПроцедуры

&НаКлиенте
Процедура ОсновнойОбъектМетаданныхОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
	
	Если ТипЗнч(ВыбранноеЗначение) <> Тип("Строка") Тогда
		СтандартнаяОбработка = Ложь;
	КонецЕсли;

	ПараметрыОбработчикаВыбора = ПараметрыОбработчикаВыбора(, ОсновнойОбъектМетаданных);
	
	ПараметрыПодключаемогоОбработчика = Новый Структура;
	ПараметрыПодключаемогоОбработчика.Вставить("ВыбранноеЗначение", ВыбранноеЗначение);
	ПараметрыПодключаемогоОбработчика.Вставить("ПараметрыОбработчикаВыбора", ПараметрыОбработчикаВыбора);
	
	ПодключитьОбработчикОжидания("Подключаемый_ОбъектМетаданныхОбработкаВыбора", 0.1, Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура ОсновнойОбъектМетаданныхАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)
	
	ВключатьОбщиеМодули = Истина;
	ПодобратьОбъектыМетаданных(Текст, ДанныеВыбора, СтандартнаяОбработка, ВключатьОбщиеМодули);
	
КонецПроцедуры

&НаКлиенте
Процедура ОсновнойОбъектМетаданныхОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, СтандартнаяОбработка)
	
	ВключатьОбщиеМодули = Истина;
	ПодобратьОбъектыМетаданных(Текст, ДанныеВыбора, СтандартнаяОбработка, ВключатьОбщиеМодули);
	
КонецПроцедуры

&НаКлиенте
Процедура ИдентификаторНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	Модифицированность = Истина;
	Объект.ОбработчикиОбновления[0].Идентификатор = Строка(Новый УникальныйИдентификатор);
	
КонецПроцедуры

&НаКлиенте
Процедура ПроцедураПриИзменении(Элемент)
	
	Если НЕ ПустаяСтрока(Объект.ОбработчикиОбновления[0].Процедура) Тогда
		АвтоЗаголовок = Ложь;
		ОсновнойОбъектМетаданных = ИмяОсновногоОбъектаМетаданных(Объект.ОбработчикиОбновления[0].Процедура, ЕдинственноеЧисло, МножественноеЧисло);
		Заголовок = Объект.ОбработчикиОбновления[0].Процедура;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПроцедураЗаполненияДанныхОбновленияПриИзменении(Элемент)
	
	Если НЕ ПустаяСтрока(Объект.ОбработчикиОбновления[0].ПроцедураЗаполненияДанныхОбновления) Тогда
		ИмяОсновногоОбъектаМетаданных(Объект.ОбработчикиОбновления[0].ПроцедураЗаполненияДанныхОбновления, ЕдинственноеЧисло, МножественноеЧисло);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПроцедураПроверкиПриИзменении(Элемент)
	
	ОписаниеОповещения = Новый ОписаниеОповещения("ПроцедураПроверкиОкончаниеВводаТекстаПослеВопроса", ЭтотОбъект, Элемент.ТекстРедактирования);
	Если Элемент.ТекстРедактирования <> СтандартнаяПроцедураПроверки() Тогда
		ПоказатьВопрос(ОписаниеОповещения, ТекстПредупрежденияИзмененаПроцедураПроверки(Истина), РежимДиалогаВопрос.ДаНет);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПроцедураПроверкиОкончаниеВводаТекстаПослеВопроса(Результат, Текст) Экспорт
	Если Результат <> КодВозвратаДиалога.Да Тогда
		Объект.ОбработчикиОбновления[0].ПроцедураПроверки = ТекущееЗначениеПроцедурыПроверки;
		Возврат;
	КонецЕсли;
	Объект.ОбработчикиОбновления[0].ПроцедураПроверки = Текст;
	ТекущееЗначениеПроцедурыПроверки = Текст;
	
	Элементы.ДекорацияПредупреждение.Видимость = (ТекущееЗначениеПроцедурыПроверки <> СтандартнаяПроцедураПроверки());
	
	Элементы.ПроцедураПроверки.ОтметкаНезаполненного = Не ЗначениеЗаполнено(Объект.ОбработчикиОбновления[0].ПроцедураПроверки);
	Если НЕ ПустаяСтрока(Объект.ОбработчикиОбновления[0].ПроцедураПроверки) Тогда
		ИмяОсновногоОбъектаМетаданных(Объект.ОбработчикиОбновления[0].ПроцедураПроверки, ЕдинственноеЧисло, МножественноеЧисло);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ДекорацияПредупреждениеНажатие(Элемент)
	ПоказатьПредупреждение(, ТекстПредупрежденияИзмененаПроцедураПроверки());
КонецПроцедуры

&НаКлиенте
Процедура ПроцедураПроверкиНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
	Если Объект.ЧитаемыеОбъекты.НайтиСтроки(Новый Структура("БлокироватьИнтерфейс", Истина)).Количество() > 0
		ИЛИ Объект.БлокируемыеОбъекты.Количество() > 0 Тогда
		ТекстСообщения = НСтр("ru = 'Процедура ""%1"" не предназначена для проверки блокировки в обработчиках, которые контролируют блокировку читаемых данных или прочих объектов.'");
		ТекстСообщения = СтрЗаменить(ТекстСообщения, "%1", "ОбновлениеИнформационнойБазы.ДанныеОбновленыНаНовуюВерсиюПрограммы");
		ОбщегоНазначенияКлиент.СообщитьПользователю(ТекстСообщения,,"ПроцедураПроверки","Объект");
		Возврат;	
	КонецЕсли;

	Объект.ОбработчикиОбновления[0].ПроцедураПроверки = СтандартнаяПроцедураПроверки();
	Элементы.ПроцедураПроверки.ОтметкаНезаполненного = Ложь;
	
	ТекущееЗначениеПроцедурыПроверки = СтандартнаяПроцедураПроверки();
	Элементы.ДекорацияПредупреждение.Видимость = Ложь;
	
КонецПроцедуры

&НаКлиенте
Процедура РежимВыполненияПриИзменении(Элемент)
	УстановитьОтметкуНезаполненногоМонопольногоОбработчика();
КонецПроцедуры

&НаКлиенте
Процедура ПодсистемаПриИзменении(Элемент)
	
	ТекущаяПодсистема = Объект.ОбработчикиОбновления[0].Подсистема;
	Если МодулиПодсистем <> Неопределено И НЕ ПустаяСтрока(ТекущаяПодсистема) Тогда
		Объект.ОбработчикиОбновления[0].ИмяОсновногоСерверногоМодуля = МодулиПодсистем[ТекущаяПодсистема];
	КонецЕсли;
	Элементы.ИмяОсновногоСерверногоМодуля.Видимость = НЕ ЗначениеЗаполнено(Объект.ОбработчикиОбновления[0].ИмяОсновногоСерверногоМодуля);
	
КонецПроцедуры

&НаКлиенте
Процедура КомментарийНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
	Оповещение = Новый ОписаниеОповещения("КомментарийНачалоВыбораЗавершение", ЭтотОбъект);
	ОбщегоНазначенияКлиент.ПоказатьФормуРедактированияМногострочногоТекста(
		Оповещение, Элементы.Комментарий.ТекстРедактирования, НСтр("ru = 'Служебный комментарий'"));
	
КонецПроцедуры

&НаКлиенте
Процедура СтраницыФормыПриСменеСтраницы(Элемент, ТекущаяСтраница)
	
	Если ТекущаяСтраница.Имя = "СтраницаКонфликты" Тогда
		Элементы.Объявление.Видимость = Модифицированность;
		Элементы.Обработчик1.РасширеннаяПодсказка.Заголовок = Объект.ОбработчикиОбновления[0].Комментарий;
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормы

&НаКлиенте
Процедура ОбъектыПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
	
	Если НоваяСтрока Тогда
		ТекущиеДанные = Элемент.ТекущиеДанные;
		ТекущиеДанные.ИндексКартинки = 1000;
		ТекущиеДанные.Ссылка = Объект.ОбработчикиОбновления[0].Ссылка;
		Если Элемент.Имя = "ИзменяемыеОбъекты" Тогда
			ТекущиеДанные.БлокироватьИнтерфейс = Истина;
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ОбъектМетаданныхНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	ИмяТаблицы = Элемент.Родитель.Родитель.Имя;
	ВыборОбъектаМетаданных(Элемент,,ИмяТаблицы);
	
КонецПроцедуры

&НаКлиенте
Процедура ОбъектМетаданныхОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
	
	Если ТипЗнч(ВыбранноеЗначение) <> Тип("Строка") Тогда
		СтандартнаяОбработка = Ложь;
	КонецЕсли;
	
	ПараметрыОбработчикаВыбора = ПараметрыОбработчикаВыбора(Элемент.Родитель.Родитель.Имя);
	
	ПараметрыПодключаемогоОбработчика = Новый Структура;
	ПараметрыПодключаемогоОбработчика.Вставить("ВыбранноеЗначение", ВыбранноеЗначение);
	ПараметрыПодключаемогоОбработчика.Вставить("ПараметрыОбработчикаВыбора", ПараметрыОбработчикаВыбора);
	
	ПодключитьОбработчикОжидания("Подключаемый_ОбъектМетаданныхОбработкаВыбора", 0.1, Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура ОбъектМетаданныхАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)
	
	ПодобратьОбъектыМетаданных(Текст, ДанныеВыбора, СтандартнаяОбработка);
	
КонецПроцедуры

&НаКлиенте
Процедура ОбъектМетаданныхОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, СтандартнаяОбработка)
	
	ПодобратьОбъектыМетаданных(Текст, ДанныеВыбора, СтандартнаяОбработка);
	
КонецПроцедуры

&НаКлиенте
Процедура ОбъектыПослеУдаления(Элемент)
	УстановитьОтметкуНезаполненногоПроцедураПроверки();
КонецПроцедуры

&НаКлиенте
Процедура СведенияОБлокировке(Команда)
	
	ТекстПредупреждения = НСтр("ru = '• Проверка на блокировку предыдущими очередями выполняется только для тех объектов которые зарегистрированы на плане обмена к обновлению для текущего обработчика;
		|
		|• Если необходимо чтобы данные к обновлению отбирались с учетом обновленных читаемых данных, то в параметрах выборки процедуры регистрации необходимо указать дополнительные источники;
		|
		|	Дополнительные источники это таблицы читаемых данных, элементы которых должны быть зарегистрированы на плане обмена в очереди с номером ниже чем у текущего обработчика.'");
	
	ПоказатьПредупреждение(, ТекстПредупреждения);
	
КонецПроцедуры

&НаКлиенте
Процедура ЧитаемыеОбъектыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	
	Если Поле.Имя = Элементы.ЧитаемыеОбъектыПредупреждение.Имя Тогда
		ИмяФормыОбработчика = "Обработка.ОписаниеОбработчиковОбновления.Форма.ОбъектыПересеченияОбработчика";
		Если НЕ ЗапускИзКонфигурации Тогда
			ИмяФормыОбработчика = "ВнешняяОбработка.ОписаниеОбработчиковОбновления.Форма.ОбъектыПересеченияОбработчика";
		КонецЕсли;
		
		АдресДанных = ПоместитьОбработчикиСНизкимПриоритетомВХранилище(Элемент.ТекущиеДанные.ОбъектМетаданных);
		ПараметрыФормы = Новый Структура;
		ПараметрыФормы.Вставить("АдресДанных", АдресДанных);
		ПараметрыФормы.Вставить("ЭтоОбработчикиСНизкимПриоритетом", Истина);
		
		ОткрытьФорму(ИмяФормыОбработчика,
			ПараметрыФормы,
			ЭтотОбъект,
			УникальныйИдентификатор,
			,
			,
			,
			РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПриоритетыВыполненияВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	
	Приоритет = Элемент.ТекущиеДанные;
	ЗаполнитьПересеченияОбработчика(Приоритет.Ссылка, Приоритет.Обработчик2);
	
	АдресДанных = ПоместитьПересеченияОбработчикаВХранилище(Приоритет.Ссылка, Приоритет.Обработчик2);
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("АдресДанных", АдресДанных);
	
	Если Поле.Имя = "ПриоритетыВыполненияОбъектыПересечения" Тогда
		ИмяФормыОбработчика = "Обработка.ОписаниеОбработчиковОбновления.Форма.ОбъектыПересеченияОбработчика";
		Если НЕ ЗапускИзКонфигурации Тогда
			ИмяФормыОбработчика = "ВнешняяОбработка.ОписаниеОбработчиковОбновления.Форма.ОбъектыПересеченияОбработчика";
		КонецЕсли;
		
		ОткрытьФорму(ИмяФормыОбработчика,
			ПараметрыФормы,
			ЭтотОбъект,
			УникальныйИдентификатор,
			,
			,
			,
			РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПриоритетыВыполненияПриАктивизацииСтроки(Элемент)
	
	Если Элемент.ТекущиеДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ПодключитьОбработчикОжидания("ОбновитьСведенияОбработчика2", 0.1, Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура ПриоритетыВыполненияВыборПорядкаВыполненияПриИзменении(Элемент)
	
	ТекущиеДанные = Элементы.ПриоритетыВыполнения.ТекущиеДанные;
	ТекущиеДанные.Порядок = "";
	ТекущиеДанные.ЗаданПорядокВыполнения = Ложь;
	Если ЗначениеЗаполнено(ТекущиеДанные.ВыборПорядкаВыполнения) Тогда
		ТекущиеДанные.Порядок = ПорядокВыполнения[ТекущиеДанные.ВыборПорядкаВыполнения];
		ТекущиеДанные.ЗаданПорядокВыполнения = ЗначениеЗаполнено(ТекущиеДанные.Порядок);
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура ЗаписатьИЗакрыть(Команда)
	
	Если НЕ ЗаполненоПравильно() Тогда
		Возврат;
	КонецЕсли;
	
	Адрес = ПоместитьДанныеОбработчикаВХранилище(ВладелецФормы.УникальныйИдентификатор);
	Модифицированность = Ложь;
	Закрыть(Адрес);
	
КонецПроцедуры

&НаКлиенте
Процедура ЗаписатьОбработчик(Команда)
	
	Если НЕ ЗаполненоПравильно() Тогда
		Возврат;
	КонецЕсли;
	
	ОчиститьСообщения();
	Адрес = ПоместитьДанныеОбработчикаВХранилище(ВладелецФормы.УникальныйИдентификатор);
	Оповестить("ИзменилосьОписаниеОбработчикаОбновления", Адрес);
	Элементы.Объявление.Видимость = Модифицированность;
	Элементы.ВыделитьПустойПорядок.Видимость = Ложь;
	
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьОбработчик1(Команда)
	ЗаполнитьПорядокВыполнения("До");
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьОбработчик2(Команда)
	ЗаполнитьПорядокВыполнения("После");
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьЛюбой(Команда)
	ЗаполнитьПорядокВыполнения("Любой");
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьОбъектОбработчикаВЧитаемые(Команда)
	
	ДобавитьОсновнойОбъектМетаданных("ЧитаемыеОбъекты");
	
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьОбъектОбработчикаВИзменяемые(Команда)
	
	ДобавитьОсновнойОбъектМетаданных("ИзменяемыеОбъекты");
	
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьИзменяемыйОбъектВЧитаемые(Команда)
	
	СтрокиОбъектов = Новый Массив;
	Для Каждого ИдСтроки Из Элементы.ИзменяемыеОбъекты.ВыделенныеСтроки Цикл
		Строка = Объект.ИзменяемыеОбъекты.НайтиПоИдентификатору(ИдСтроки);
		СтрокиОбъектов.Добавить(Строка);
	КонецЦикла;
	ДобавитьОбъектыВТаблицу("ЧитаемыеОбъекты", СтрокиОбъектов);
	
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьЧитаемыйОбъектВИзменяемые(Команда)
	
	СтрокиОбъектов = Новый Массив;
	Для Каждого ИдСтроки Из Элементы.ЧитаемыеОбъекты.ВыделенныеСтроки Цикл
		Строка = Объект.ЧитаемыеОбъекты.НайтиПоИдентификатору(ИдСтроки);
		СтрокиОбъектов.Добавить(Строка);
	КонецЦикла;
	ДобавитьОбъектыВТаблицу("ИзменяемыеОбъекты", СтрокиОбъектов);
	
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьТипыРеквизитаВЧитаемые(Команда)
	
	ДобавитьТипыРеквизита("ЧитаемыеОбъекты");
	
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьТипыРеквизитаВБлокируемыеОбъекты(Команда)
	
	ИменаОбъектов = Новый СписокЗначений;
	Для Каждого Строка Из Объект.ЧитаемыеОбъекты Цикл
		ИменаОбъектов.Добавить(Строка.ОбъектМетаданных);
	КонецЦикла;
	Для Каждого Строка Из Объект.ИзменяемыеОбъекты Цикл
		ИменаОбъектов.Добавить(Строка.ОбъектМетаданных);
	КонецЦикла;
	ИменаОбъектов.СортироватьПоЗначению();
	
	ДополнительныеПараметры = Новый Структура("ИмяТаблицы", "БлокируемыеОбъекты");
	ОбработчикВыбора = Новый ОписаниеОповещения("ЗавершениеВыбораОбъектаМетаданных", ЭтотОбъект, ДополнительныеПараметры);
	ИменаОбъектов.ПоказатьВыборЭлемента(ОбработчикВыбора, НСтр("ru = 'Выберите объект метаданных'"));
	
КонецПроцедуры

&НаКлиенте
Процедура ВыделитьПустойПорядок(Команда)
	
	ВыделенныеСтроки = Элементы.ПриоритетыВыполнения.ВыделенныеСтроки;
	УжеВыделенные = Новый Массив;
	Для Каждого ИдСтроки Из ВыделенныеСтроки Цикл
		Приоритет = Объект.ПриоритетыВыполнения.НайтиПоИдентификатору(ИдСтроки);
		Если ПустаяСтрока(Приоритет.Порядок) Тогда
			УжеВыделенные.Добавить(ИдСтроки);
		КонецЕсли;
	КонецЦикла;
	ВыделенныеСтроки.Очистить();
	Для Каждого ИдСтроки Из УжеВыделенные Цикл
		ВыделенныеСтроки.Добавить(ИдСтроки);
	КонецЦикла;
	Для Каждого Приоритет Из Объект.ПриоритетыВыполнения Цикл
		Если ПустаяСтрока(Приоритет.Порядок) Тогда
			ВыделенныеСтроки.Добавить(Приоритет.НомерСтроки-1);
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

&НаКлиенте
Процедура Подключаемый_ОбъектМетаданныхОбработкаВыбора()
	
	ВыбранноеЗначение = ПараметрыПодключаемогоОбработчика.ВыбранноеЗначение;
	ПараметрыОбработчикаВыбора = ПараметрыПодключаемогоОбработчика.ПараметрыОбработчикаВыбора;
	
	ОбработкаВыбораОбъектаМетаданных(ВыбранноеЗначение, ПараметрыОбработчикаВыбора);
	
КонецПроцедуры

&НаСервере
Процедура УстановитьУсловноеОформление()
	
	УсловноеОформление.Элементы.Очистить();
	//
	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ПриоритетыВыполненияВыборПорядкаВыполнения.Имя);
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.ПриоритетыВыполнения.Порядок");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Новый ПолеКомпоновкиДанных("Объект.ПриоритетыВыполнения.ПорядокАвто");

	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет);
	
	//
	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ЧитаемыеОбъектыОбъектМетаданных.Имя);
	
	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.ЧитаемыеОбъекты.ЕстьПисательНизкогоПорядка");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Истина;

	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ЦветОсобогоТекста);
	
КонецПроцедуры

&НаКлиенте
Процедура КомментарийНачалоВыбораЗавершение(РезультатЗакрытия, ДополнительныеПараметры) Экспорт

	Если РезультатЗакрытия <> Неопределено Тогда
		Объект.ОбработчикиОбновления[0].Комментарий = РезультатЗакрытия;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Функция ЗаполненоПравильно()
	
	Если НЕ ПроверитьЗаполнение() Тогда
		Возврат Ложь;
	КонецЕсли;
	
	ТекущийОбработчик = Объект.ОбработчикиОбновления[0];
	Если ТекущийОбработчик.РежимВыполнения = "Отложенно" 
		И Объект.ИзменяемыеОбъекты.Количество() = 0 Тогда
		ТекстСообщения = НСтр("ru = 'Отложенный обработчик не может быть записан с пустой табличной частью ""Изменяемые объекты""'");
		ОбщегоНазначенияКлиент.СообщитьПользователю(ТекстСообщения);
		Элементы.СтраницыФормы.ТекущаяСтраница = Элементы.СтраницаОбъекты;
		Возврат Ложь;
	КонецЕсли;
	
	Возврат Истина;
	
КонецФункции

&НаСервере
Функция ПоместитьДанныеОбработчикаВХранилище(УникальныйИдентификаторВладельцаФормы)
	
	Данные = Новый Структура("ТабличныеЧасти", Новый Структура);
	Объект.ОбработчикиОбновления[0].Изменен = Истина;
	Данные.ТабличныеЧасти.Вставить("ОбработчикиОбновления", Объект.ОбработчикиОбновления.Выгрузить());
	Данные.ТабличныеЧасти.Вставить("ЧитаемыеОбъекты", Объект.ЧитаемыеОбъекты.Выгрузить());
	Данные.ТабличныеЧасти.Вставить("ИзменяемыеОбъекты", Объект.ИзменяемыеОбъекты.Выгрузить());
	Данные.ТабличныеЧасти.Вставить("БлокируемыеОбъекты", Объект.БлокируемыеОбъекты.Выгрузить());
	Данные.ТабличныеЧасти.Вставить("ПриоритетыВыполнения", Объект.ПриоритетыВыполнения.Выгрузить());
	
	Возврат ПоместитьВоВременноеХранилище(Данные,  УникальныйИдентификаторВладельцаФормы);
	
КонецФункции

&НаСервере
Функция ПредставлениеОбъектаМетаданных(СсылкаОбъектаМетаданных)
	
	ИмяРеквизита = "ПолноеИмя";
	Если ТипЗнч(СсылкаОбъектаМетаданных) = Тип("Строка") Тогда
		ПолноеИмя = СсылкаОбъектаМетаданных;
	Иначе
		ПолноеИмя = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СсылкаОбъектаМетаданных, ИмяРеквизита);
	КонецЕсли;
	
	Результат = Новый Структура;
	Результат.Вставить("ОбъектМетаданных", ПолноеИмя);
	Результат.Вставить("ИндексКартинки", ИндексКартинки(ПолноеИмя));
	
	Возврат Результат;
	
КонецФункции

&НаСервере
Функция ИндексКартинки(ПолноеИмяОбъектаМетаданных)
	
	ТипОбъектаМетаданных = СтрРазделить(ПолноеИмяОбъектаМетаданных, ".")[0];
	Результат = 0;
	Если ИндексыКартинокТипов.Свойство(ТипОбъектаМетаданных) Тогда
		Результат = ИндексыКартинокТипов[ТипОбъектаМетаданных];
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

&НаСервере
Процедура ЗаполнитьСоответствияМодуля(МассивПорядка)
	
	ИндексыКартинок = Новый Структура;
	ИндексыКартинок.Вставить("Константа", 1);
	ИндексыКартинок.Вставить("Справочник", 3);
	ИндексыКартинок.Вставить("Документ", 7);
	ИндексыКартинок.Вставить("ПланВидовХарактеристик", 9);
	ИндексыКартинок.Вставить("ПланСчетов", 11);
	ИндексыКартинок.Вставить("ПланВидовРасчета", 13);
	ИндексыКартинок.Вставить("РегистрСведений", 15);
	ИндексыКартинок.Вставить("РегистрНакопления", 17);
	ИндексыКартинок.Вставить("РегистрБухгалтерии", 19);
	ИндексыКартинок.Вставить("РегистрРасчета", 21);
	ИндексыКартинок.Вставить("БизнесПроцесс", 23);
	ИндексыКартинок.Вставить("Задача", 25);
	
	ИндексыКартинокТипов = Новый ФиксированнаяСтруктура(ИндексыКартинок);
	
	МнЧисло = Новый Соответствие;
	МнЧисло.Вставить("Константа", "Константы");
	МнЧисло.Вставить("Справочник", "Справочники");
	МнЧисло.Вставить("Документ", "Документы");
	МнЧисло.Вставить("ПланВидовХарактеристик", "ПланыВидовХарактеристик");
	МнЧисло.Вставить("ПланСчетов", "ПланыСчетов");
	МнЧисло.Вставить("ПланВидовРасчета", "ПланыВидовРасчета");
	МнЧисло.Вставить("РегистрСведений", "РегистрыСведений");
	МнЧисло.Вставить("РегистрНакопления", "РегистрыНакопления");
	МнЧисло.Вставить("РегистрБухгалтерии", "РегистрыБухгалтерии");
	МнЧисло.Вставить("РегистрРасчета", "РегистрыРасчета");
	МнЧисло.Вставить("БизнесПроцесс", "БизнесПроцессы");
	МнЧисло.Вставить("Задача", "Задачи");
	МнЧисло.Вставить("Обработка", "Обработки");
	
	ЕдЧисло = Новый Соответствие;
	Для Каждого Класс Из МнЧисло Цикл
		ЕдЧисло.Вставить(Класс.Значение, Класс.Ключ);
	КонецЦикла;
	
	МножественноеЧисло = Новый ФиксированноеСоответствие(МнЧисло);
	ЕдинственноеЧисло = Новый ФиксированноеСоответствие(ЕдЧисло);
		
	Порядок = Новый Соответствие;
	Порядок.Вставить(МассивПорядка[0], "До");
	Порядок.Вставить(МассивПорядка[1], "После");
	Порядок.Вставить(МассивПорядка[2], "Любой");
	ПорядокВыполнения = Новый ФиксированноеСоответствие(Порядок);
	
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Функция ИмяОсновногоОбъектаМетаданных(ИмяПроцедуры, ЕдинственноеЧисло, МножественноеЧисло)
	
	ЧастиИмени = СтрРазделить(ИмяПроцедуры, ".");
	ПолноеИмяОбъекта = "";
	Если ЧастиИмени.Количество() = 2 Тогда
		ПолноеИмяОбъекта = "ОбщийМодуль." + ЧастиИмени[0];
	ИначеЕсли ЧастиИмени.Количество() = 3 Тогда
		Попытка
			ЧастиИмени[0] = ЕдинственноеЧисло[ЧастиИмени[0]];
		Исключение
			#Если Клиент Тогда
				КодОсновногоЯзыка = ОбщегоНазначенияКлиент.КодОсновногоЯзыка();
			#КонецЕсли
			#Если Сервер Тогда
				КодОсновногоЯзыка = ОбщегоНазначения.КодОсновногоЯзыка();
			#КонецЕсли
			ТекстСообщения = НСтр("ru = 'Не удалось распознать вид объекта метаданных ""%1""
				|Вид объекта должен быть во множественном числе.'", КодОсновногоЯзыка);
			ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСообщения, ЧастиИмени[0]);
			ВызватьИсключение ТекстСообщения;
		КонецПопытки;
		ЧастиИмени.Удалить(ЧастиИмени.ВГраница());
		ПолноеИмяОбъекта = СтрСоединить(ЧастиИмени, ".");
	КонецЕсли;
	Возврат ПолноеИмяОбъекта;
	
КонецФункции

&НаКлиенте
Процедура ВыборОбъектаМетаданных(Элемент, ТекущееЗначение = "", ИмяТаблицы = Неопределено)
	
	Если НЕ ЕстьИдентификаторыОбъектовМетаданных Тогда
		Возврат;
	КонецЕсли;
	
	МассивСсылок = ДоступныеКлассыДляДляВыбораМетаданных(ИмяТаблицы = Неопределено);
	СписокРодителей = Новый СписокЗначений;
	СписокРодителей.ЗагрузитьЗначения(МассивСсылок);
	
	ПараметрыФормы = Новый Структура();
	ПараметрыФормы.Вставить("РежимВыбора", Истина);
	
	СтруктураОтбора = Новый Структура;
	СтруктураОтбора.Вставить("Родитель", СписокРодителей);
	
	ПараметрыФормы.Вставить("Отбор", СтруктураОтбора);
	Если ИмяТаблицы <> Неопределено Тогда
		ТекущееЗначение = Элементы[ИмяТаблицы].ТекущиеДанные.ОбъектМетаданных;
	КонецЕсли;
	ПараметрыФормы.Вставить("ТекущаяСтрока", ТекущееЗначение);
	ПараметрыФормы.Вставить("ОсновнойОбъектМетаданных", Неопределено);
	Если ТекущийЭлемент.Имя = Элементы.ЧитаемыеОбъекты.Имя Тогда
		ПараметрыФормы.Вставить("ОсновнойОбъектМетаданных", ОсновнойОбъектМетаданных);
	КонецЕсли;
	
	ПараметрыОбработчикаВыбора = ПараметрыОбработчикаВыбора(ИмяТаблицы, ТекущееЗначение);
	ОбработчикВыбора = Новый ОписаниеОповещения("ОбработкаВыбораОбъектаМетаданных", ЭтотОбъект, ПараметрыОбработчикаВыбора);
	
	ИмяФормыВыбора = "Обработка.ОписаниеОбработчиковОбновления.Форма.ФормаВыбораИдентификаторовОбъектовМетаданных";
	Если НЕ ЗапускИзКонфигурации Тогда
		ИмяФормыВыбора = "ВнешняяОбработка.ОписаниеОбработчиковОбновления.Форма.ФормаВыбораИдентификаторовОбъектовМетаданных";
	КонецЕсли;
	
	ОткрытьФорму(ИмяФормыВыбора,
		ПараметрыФормы,
		Элемент,
		УникальныйИдентификатор,
		,
		,
		ОбработчикВыбора,
		РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

КонецПроцедуры

&НаКлиенте
Функция ПараметрыОбработчикаВыбора(ИмяТаблицы = Неопределено, ТекущееЗначение = "")
	
	ПараметрыОбработчикаВыбора = Новый Структура("ИмяРеквизита", "ОсновнойОбъектМетаданных");
	Если ЗначениеЗаполнено(ИмяТаблицы) Тогда
		ПараметрыОбработчикаВыбора = Новый Структура("ИмяТаблицы", ИмяТаблицы);
	КонецЕсли;
	ПараметрыОбработчикаВыбора.Вставить("ПредыдущееЗначение", ТекущееЗначение);
	
	Возврат ПараметрыОбработчикаВыбора;
	
КонецФункции

&НаКлиенте
Процедура ОбработкаВыбораОбъектаМетаданных(ВыбранноеЗначение, ДополнительныеПараметры) Экспорт
	
	Если ЗначениеЗаполнено(ВыбранноеЗначение) Тогда
		ПредставлениеОбъекта = ПредставлениеОбъектаМетаданных(ВыбранноеЗначение);
		Если ДополнительныеПараметры.Свойство("ИмяТаблицы") Тогда
			ТекущиеДанные = Элементы[ДополнительныеПараметры.ИмяТаблицы].ТекущиеДанные;
			ТекущиеДанные.ИндексКартинки = ПредставлениеОбъекта.ИндексКартинки;
			ТекущиеДанные.ОбъектМетаданных = ПредставлениеОбъекта.ОбъектМетаданных;
			
		ИначеЕсли ДополнительныеПараметры.Свойство("ИмяРеквизита") Тогда
			Модифицированность = Истина;
			ЭтотОбъект[ДополнительныеПараметры.ИмяРеквизита] = ПредставлениеОбъекта.ОбъектМетаданных;
			Заголовок = ПредставлениеОбъекта.ОбъектМетаданных;
			АвтоЗаголовок = Ложь;
			Если ЗначениеЗаполнено(ПредставлениеОбъекта.ОбъектМетаданных) Тогда
				ЧастиИмени = СтрРазделить(ПредставлениеОбъекта.ОбъектМетаданных, ".");
				Если ЧастиИмени.Количество() > 0 Тогда
					Если ЧастиИмени[0] = "ОбщийМодуль" Тогда
						ЧастиИмени.Удалить(0);
					Иначе
						ЧастиИмени[0] = МножественноеЧисло[ЧастиИмени[0]];
					КонецЕсли;
					ИмяОбъекта = СтрСоединить(ЧастиИмени, ".");
					ОбновитьИмяПроцедуры("Процедура", ИмяОбъекта, ДополнительныеПараметры.ПредыдущееЗначение, "ОбработатьДанныеДляПереходаНаНовуюВерсию");
					ОбновитьИмяПроцедуры("ПроцедураЗаполненияДанныхОбновления", ИмяОбъекта, ДополнительныеПараметры.ПредыдущееЗначение, "ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию");
				КонецЕсли;
			КонецЕсли;
			
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура ОбновитьИмяПроцедуры(КонтейнерИмени, ИмяОбъекта, Знач ПредыдущееИмяОбъекта, ИмяНовойПроцедуры)
	
	ТекущийОбработчик = Объект.ОбработчикиОбновления[0];
	Если ПустаяСтрока(ТекущийОбработчик[КонтейнерИмени]) Тогда
		ТекущийОбработчик[КонтейнерИмени] = ИмяОбъекта + "." + ИмяНовойПроцедуры;
	
	ИначеЕсли НЕ ПустаяСтрока(ПредыдущееИмяОбъекта) Тогда
		ЧастиИмени = СтрРазделить(ПредыдущееИмяОбъекта, ".");
		Если ЧастиИмени.Количество() > 0 Тогда
			Если ЧастиИмени[0] = "ОбщийМодуль" Тогда
				ЧастиИмени.Удалить(0);
			Иначе
				ЧастиИмени[0] = МножественноеЧисло[ЧастиИмени[0]];
			КонецЕсли;
			ПредыдущееИмяОбъекта = СтрСоединить(ЧастиИмени, ".");
		КонецЕсли;
		
		ТекущийОбработчик[КонтейнерИмени] = СтрЗаменить(ТекущийОбработчик[КонтейнерИмени], ПредыдущееИмяОбъекта, ИмяОбъекта);
		
	КонецЕсли;
	
КонецПроцедуры

&НаСервереБезКонтекста
Функция ДоступныеКлассыДляДляВыбораМетаданных(ВключитьОбщиеМодули = Ложь)
	
	МассивКлассов = ДоступныеКлассыОбъектовМетаданных(ВключитьОбщиеМодули);
	
	ТекстЗапроса =
	"ВЫБРАТЬ РАЗРЕШЕННЫЕ
	|	ИдентификаторыОбъектов.Ссылка КАК Ссылка
	|ИЗ
	|	Справочник.ИдентификаторыОбъектовМетаданных КАК ИдентификаторыОбъектов
	|ГДЕ
	|	ИдентификаторыОбъектов.Имя В(&МассивКлассов)
	|	И НЕ ИдентификаторыОбъектов.ПометкаУдаления
	|	И ИдентификаторыОбъектов.Родитель = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)";
	
	Запрос = Новый Запрос(ТекстЗапроса);
	Запрос.УстановитьПараметр("МассивКлассов", МассивКлассов);
	
	МассивСсылок = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");
	
	Возврат МассивСсылок;
	
КонецФункции

&НаСервереБезКонтекста
Функция ДоступныеКлассыОбъектовМетаданных(ВключитьОбщиеМодули = Ложь)
	
	МассивОграничений = Новый Массив;
	
	Если ВключитьОбщиеМодули Тогда
		МассивОграничений.Добавить("ОбщиеМодули");
	КонецЕсли;
	
	МассивОграничений.Добавить("БизнесПроцессы");
	МассивОграничений.Добавить("Документы");
	МассивОграничений.Добавить("Задачи");
	МассивОграничений.Добавить("Константы");
	МассивОграничений.Добавить("ПараметрыСеанса");
	МассивОграничений.Добавить("ПланыВидовРасчета");
	МассивОграничений.Добавить("ПланыВидовХарактеристик");
	МассивОграничений.Добавить("ПланыОбмена");
	МассивОграничений.Добавить("ПланыСчетов");
	МассивОграничений.Добавить("Последовательности");
	МассивОграничений.Добавить("РегистрыБухгалтерии");
	МассивОграничений.Добавить("РегистрыНакопления");
	МассивОграничений.Добавить("РегистрыРасчета");
	МассивОграничений.Добавить("РегистрыСведений");
	МассивОграничений.Добавить("РегламентныеЗадания");
	МассивОграничений.Добавить("Справочники");
	
	Возврат МассивОграничений;
	
КонецФункции

&НаСервере
Процедура ОбновитьДанныеОКонфликтахОбработчика(АдресОбработчика)
	
	Данные = ПолучитьИзВременногоХранилища(АдресОбработчика);
	Объект.КонфликтыОбработчиков.Очистить();
	Объект.КонфликтыОбработчиков.Загрузить(Данные.ТабличныеЧасти.КонфликтыОбработчиков);
	Элементы.Обработчик1.РасширеннаяПодсказка.Заголовок = Данные.ТабличныеЧасти.ОбработчикиОбновления[0].Комментарий;
	
	ЗагрузитьПриоритетыОбработчика(Данные.ТабличныеЧасти.ПриоритетыВыполнения);
	ЗагрузитьЧтениеНизкогоПорядка(Данные.ТабличныеЧасти.ЧтениеНизкогоПорядка);
	
КонецПроцедуры

&НаСервере
Процедура ЗагрузитьПриоритетыОбработчика(НовыеПриоритеты)
	
	ИмяОсновногоОбъекта = ИмяОсновногоОбъектаМетаданных(Объект.ОбработчикиОбновления[0].Процедура, ЕдинственноеЧисло, МножественноеЧисло);
	Объект.ПриоритетыВыполнения.Очистить();
	Для Каждого Приоритет Из НовыеПриоритеты Цикл
		НоваяСтрока = Объект.ПриоритетыВыполнения.Добавить();
		ЗаполнитьЗначенияСвойств(НоваяСтрока, Приоритет);
		Если ЗначениеЗаполнено(Приоритет.Порядок) Тогда
			НоваяСтрока.ВыборПорядкаВыполнения = ПредставлениеПорядка[Приоритет.Порядок];
		КонецЕсли;
		
		ЗаполнитьПересеченияОбработчика(Приоритет.Ссылка, Приоритет.Обработчик2);
		ОбъектыПересечения = Пересечения.Выгрузить(,"ОбъектМетаданных");
		
		ОбъектыПересечения.Свернуть("ОбъектМетаданных");
		ОбъектыПересечения.Сортировать("ОбъектМетаданных");
		Если ОбъектыПересечения.Количество() = 1 Тогда
			НоваяСтрока.ОбъектыПересечения = ОбъектыПересечения[0].ОбъектМетаданных;
			
		ИначеЕсли ОбъектыПересечения.Количество() > 1 Тогда
			Для Каждого ОбъектПересечения Из ОбъектыПересечения Цикл
				Если ИмяОсновногоОбъекта <> ОбъектПересечения.ОбъектМетаданных Тогда
					НоваяСтрока.ОбъектыПересечения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
														"%1 +%2", ОбъектПересечения.ОбъектМетаданных, ОбъектыПересечения.Количество()-1);
					Прервать;
				КонецЕсли;
			КонецЦикла;
			
		КонецЕсли;
	КонецЦикла;
	Объект.ПриоритетыВыполнения.Сортировать("Процедура2");
	
	Если Объект.ПриоритетыВыполнения.Количество() > 1 Тогда
		ВысотаТаблицы = Объект.ПриоритетыВыполнения.Количество()+1;
		Если ВысотаТаблицы > 8 Тогда
			ВысотаТаблицы = 8;
		КонецЕсли;
		Элементы.ПриоритетыВыполнения.ВысотаВСтрокахТаблицы = ВысотаТаблицы;
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура ЗагрузитьЧтениеНизкогоПорядка(ЧтениеНизкогоПорядка)
	
	Объект.ЧтениеНизкогоПорядка.Загрузить(ЧтениеНизкогоПорядка);
	Если ЧтениеНизкогоПорядка.Количество() > 0 Тогда
		Элементы.ЧитаемыеОбъектыПредупреждение.Видимость = Истина;
		Отбор = Новый Структура("ОбъектМетаданных");
		Для Каждого Читаемый Из Объект.ЧитаемыеОбъекты Цикл
			Отбор.ОбъектМетаданных = Читаемый.ОбъектМетаданных;
			НайденныеСтроки = Объект.ЧтениеНизкогоПорядка.НайтиСтроки(Отбор);
			Если НайденныеСтроки.Количество() > 0 Тогда
				Читаемый.ЕстьПисательНизкогоПорядка = Истина;
				Читаемый.Предупреждение = БиблиотекаКартинок.Предупреждение;
			КонецЕсли;
		КонецЦикла;
		ТекстСообщения = НСтр("ru = 'Среди читаемых объектов обработчика имеются объекты, которые обрабатываются обработчиками с более низким приоритетом чем текущий.
		|Это приведет к тому что текущий обработчик будет ждать их завершения. Необходимо устранить это несоответствие.'");
		ОбщегоНазначения.СообщитьПользователю(ТекстСообщения);
	Иначе
		Элементы.ЧитаемыеОбъектыПредупреждение.Видимость = Ложь;
		Для Каждого Читаемый Из Объект.ЧитаемыеОбъекты Цикл
			Читаемый.ЕстьПисательНизкогоПорядка = Ложь;
			Читаемый.Предупреждение = Неопределено;
		КонецЦикла;
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Функция ПоместитьПересеченияОбработчикаВХранилище(ТекущийОбработчик, КонфликтующийОбработчик)
	
	ЗаполнитьПересеченияОбработчика(ТекущийОбработчик, КонфликтующийОбработчик);
	Адрес = ПоместитьВоВременноеХранилище(Пересечения.Выгрузить(), УникальныйИдентификатор);
	Возврат Адрес;
	
КонецФункции

&НаСервере
Функция ПоместитьОбработчикиСНизкимПриоритетомВХранилище(ОбъектМетаданных)
	
	Данные = Объект.ЧтениеНизкогоПорядка.Выгрузить(Новый Структура("ОбъектМетаданных", ОбъектМетаданных));
	Адрес = ПоместитьВоВременноеХранилище(Данные, УникальныйИдентификатор);
	Возврат Адрес;
	
КонецФункции

&НаСервере
Процедура ЗаполнитьПересеченияОбработчика(ТекущийОбработчик, КонфликтующийОбработчик)
	
	Пересечения.Очистить();
	Для Каждого Конфликт Из Объект.КонфликтыОбработчиков Цикл
		Отбор = Новый Структура("ОбъектМетаданных,ПроцедураПисатель,ПроцедураЧитательИлиПисатель2", 
							Конфликт.ОбъектМетаданных, Конфликт.ПроцедураЧитательИлиПисатель2, Конфликт.ПроцедураПисатель);
		ОбратныеКонфликты = Пересечения.НайтиСтроки(Отбор);
		Если Конфликт.ОбработчикПисатель = ТекущийОбработчик
				И Конфликт.ОбработчикЧитательИлиПисатель2 = КонфликтующийОбработчик
			ИЛИ Конфликт.ОбработчикПисатель = КонфликтующийОбработчик
				И Конфликт.ОбработчикЧитательИлиПисатель2 = ТекущийОбработчик 
			И ОбратныеКонфликты.Количество() = 0 Тогда
			НовоеПересечение = Пересечения.Добавить();
			ЗаполнитьЗначенияСвойств(НовоеПересечение, Конфликт);
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьСведенияОбработчика2()
	
	ТекущиеДанные = Элементы.ПриоритетыВыполнения.ТекущиеДанные;
	
	Обработчик2 = ТекущиеДанные.Процедура2;
	Элементы.Обработчик2.РасширеннаяПодсказка.Заголовок = ТекущиеДанные.Комментарий2;
	ЗаполнитьПересеченияОбработчика(ТекущиеДанные.Ссылка, ТекущиеДанные.Обработчик2);
	
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьПорядокВыполнения(НовыйПорядок)
	
	ВыделенныеСтроки = Элементы.ПриоритетыВыполнения.ВыделенныеСтроки;
	Если ВыделенныеСтроки.Количество() > 0 Тогда
		Для Каждого ИдСтроки Из ВыделенныеСтроки Цикл
			Приоритет = Объект.ПриоритетыВыполнения.НайтиПоИдентификатору(ИдСтроки);
			Приоритет.Порядок = НовыйПорядок;
			Приоритет.ВыборПорядкаВыполнения = ПредставлениеПорядка[НовыйПорядок];
			Приоритет.ЗаданПорядокВыполнения = Истина;
		КонецЦикла;
	КонецЕсли;
	Модифицированность = Истина;
	
КонецПроцедуры

&НаСервере
Процедура УстановитьОтметкуНезаполненногоПроцедураПроверки()
	
	Отметка = Истина;
	
	Если ЗначениеЗаполнено(Объект.ОбработчикиОбновления[0].Процедура)
		ИЛИ Объект.ОбработчикиОбновления[0].РежимВыполнения = "Монопольно"
		ИЛИ Объект.ОбработчикиОбновления[0].РежимВыполнения = "Оперативно"
		ИЛИ НЕ (Объект.БлокируемыеОбъекты.Количество() > 0
				ИЛИ Объект.ЧитаемыеОбъекты.НайтиСтроки(Новый Структура("БлокироватьИнтерфейс", Истина)).Количество() > 0
				ИЛИ Объект.ИзменяемыеОбъекты.НайтиСтроки(Новый Структура("БлокироватьИнтерфейс", Истина)).Количество() > 0) Тогда
		Отметка = Ложь;
	КонецЕсли;
	
	Элементы.ПроцедураПроверки.ОтметкаНезаполненного = Отметка;
	
КонецПроцедуры

&НаСервере
Процедура УстановитьОтметкуНезаполненногоМонопольногоОбработчика()
	
	МонопольныйОбработчик = Объект.ОбработчикиОбновления[0].РежимВыполнения = "Монопольно";
	Если МонопольныйОбработчик Тогда
		Элементы.ПроцедураЗаполненияДанныхОбновления.АвтоОтметкаНезаполненного = НЕ МонопольныйОбработчик;
		Элементы.ПроцедураЗаполненияДанныхОбновления.ОтметкаНезаполненного = НЕ МонопольныйОбработчик;
		Элементы.Комментарий.АвтоОтметкаНезаполненного = НЕ МонопольныйОбработчик;
		Элементы.Комментарий.ОтметкаНезаполненного = НЕ МонопольныйОбработчик;
	Иначе
		Элементы.ПроцедураЗаполненияДанныхОбновления.АвтоОтметкаНезаполненного = Неопределено;
		Элементы.Комментарий.АвтоОтметкаНезаполненного = Неопределено;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПодобратьОбъектыМетаданных(Текст, ДанныеВыбора, СтандартнаяОбработка, ВключатьОбщиеМодули = Ложь)
	
	Если ПустаяСтрока(Текст) Тогда
		Возврат;
	КонецЕсли;
	
	СтандартнаяОбработка = Ложь;
	ВключатьОбщиеМодули = Истина;
	ОбъектыМетаданных = НайтиОбъектыМетаданных(Текст, ВключатьОбщиеМодули, ОбщиеМодули);
	
	Если ТекущийЭлемент.Имя = Элементы.ЧитаемыеОбъекты.Имя Тогда
		Индекс = ОбъектыМетаданных.Найти(ОсновнойОбъектМетаданных);
		Если Индекс <> Неопределено Тогда
			ОбъектыМетаданных.Удалить(Индекс);
		КонецЕсли;
	КонецЕсли;
	
	ДанныеВыбора = Новый СписокЗначений;
	ДанныеВыбора.ЗагрузитьЗначения(ОбъектыМетаданных);
	
КонецПроцедуры

&НаСервереБезКонтекста
Функция НайтиОбъектыМетаданных(ЧастьИмени, ВключатьОбщиеМодули, Знач ВсеОбщиеМодули)
	
	ТекстЗапроса = ТекстЗапросаИдентификаторовОбъектовМетаданных();
	
	Запрос = Новый Запрос(ТекстЗапроса);
	Запрос.УстановитьПараметр("ОбщиеМодули", ВсеОбщиеМодули.Выгрузить());
	Запрос.УстановитьПараметр("ВключатьОбщиеМодули", ВключатьОбщиеМодули);
	Запрос.УстановитьПараметр("ЧастьИмени", "%" + ОбщегоНазначения.СформироватьСтрокуДляПоискаВЗапросе(ЧастьИмени) + "%");
	Запрос.УстановитьПараметр("МассивКлассов", ДоступныеКлассыОбъектовМетаданных(ВключатьОбщиеМодули));
	ОбъектыМетаданных = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");
	
	Возврат ОбъектыМетаданных;
	
КонецФункции

&НаСервереБезКонтекста
Функция ТекстЗапросаИдентификаторовОбъектовМетаданных()
	
	Возврат 
	"ВЫБРАТЬ
	|	Т.Имя КАК Имя
	|ПОМЕСТИТЬ ОбщиеМодули
	|ИЗ
	|	&ОбщиеМодули КАК Т
	|ГДЕ
	|	&ВключатьОбщиеМодули
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ ПЕРВЫЕ 50
	|	ОбъектыМетаданных.ПолноеИмя КАК Ссылка
	|ИЗ
	|	Справочник.ИдентификаторыОбъектовМетаданных КАК ОбъектыМетаданных
	|ГДЕ
	|	НЕ ОбъектыМетаданных.ПометкаУдаления
	|	И ОбъектыМетаданных.ПолноеИмя ПОДОБНО &ЧастьИмени СПЕЦСИМВОЛ ""~""
	|
	|	И ОбъектыМетаданных.Родитель.Имя В(&МассивКлассов)
	|	И НЕ ОбъектыМетаданных.Родитель.ПометкаУдаления
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ ПЕРВЫЕ 50
	|	ОбщиеМодули.Имя
	|ИЗ
	|	ОбщиеМодули КАК ОбщиеМодули
	|ГДЕ
	|	ОбщиеМодули.Имя ПОДОБНО &ЧастьИмени СПЕЦСИМВОЛ ""~""
	|
	|УПОРЯДОЧИТЬ ПО
	|	Ссылка";

КонецФункции

&НаСервере
Процедура ДобавитьОсновнойОбъектМетаданных(ИмяТаблицы)
	
	Если ПустаяСтрока(ОсновнойОбъектМетаданных) Тогда
		Возврат;
	КонецЕсли;
	
	Отбор = Новый Структура("ОбъектМетаданных", ОсновнойОбъектМетаданных);
	НайденныеСтроки = Объект[ИмяТаблицы].НайтиСтроки(Отбор);
	Если НайденныеСтроки.Количество() > 0 Тогда
		Возврат;
	КонецЕсли;
	
	НоваяСтрока = Объект[ИмяТаблицы].Добавить(); // ДанныеФормыЭлементКоллекции - см. Обработка.ОписаниеОбработчиковОбновления.ЧитаемыеОбъекты
	НоваяСтрока.Ссылка = Объект.ОбработчикиОбновления[0].Ссылка;
	НоваяСтрока.ОбъектМетаданных = ОсновнойОбъектМетаданных;
	НоваяСтрока.ИндексКартинки = ИндексКартинки(ОсновнойОбъектМетаданных);
	НоваяСтрока.БлокироватьИнтерфейс = ИмяТаблицы = "ИзменяемыеОбъекты";
	Модифицированность = Истина;
	
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьТипыРеквизита(ИмяТаблицы, ИмяОбъекта = "")
	
	Если ПустаяСтрока(ИмяОбъекта) Тогда
		Если Элементы[ИмяТаблицы].ТекущиеДанные = Неопределено Тогда
			ПоказатьПредупреждение(,НСтр("ru = 'Не выбран объект метаданных'"));
			Возврат;
		КонецЕсли;
		
		ИмяОбъекта = Элементы[ИмяТаблицы].ТекущиеДанные.ОбъектМетаданных;
		Если ПустаяСтрока(ИмяОбъекта) Тогда
			Возврат;
		КонецЕсли;
	КонецЕсли;
	Реквизиты = РеквизитыОбъектаМетаданных(ИмяОбъекта);
	ВыбратьРеквизитОбъектаМетаданных(Реквизиты, ИмяТаблицы, ИмяОбъекта);
	
КонецПроцедуры

&НаКлиенте
Процедура ВыбратьРеквизитОбъектаМетаданных(Реквизиты, ИмяТаблицы, ИмяОбъекта)
	
	Имена = СтрРазделить(ИмяОбъекта, ".");
	Имена[0] = МножественноеЧисло[Имена[0]];
	ИмяОбъекта = СтрСоединить(Имена, ".");
	
	ДополнительныеПараметры = Новый Структура("ИмяТаблицы, ИмяОбъекта", ИмяТаблицы, ИмяОбъекта);
	ОбработчикВыбора = Новый ОписаниеОповещения("ЗавершениеВыбораРеквизитаОбъектаМетаданных", ЭтотОбъект, ДополнительныеПараметры);
	Реквизиты.ПоказатьВыборЭлемента(ОбработчикВыбора, НСтр("ru = 'Выберите реквизит объекта'"));
	
КонецПроцедуры

&НаКлиенте
Процедура ЗавершениеВыбораОбъектаМетаданных(Результат, ДополнительныеПараметры) Экспорт
	
	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Реквизиты = РеквизитыОбъектаМетаданных(Результат.Значение);
	ВыбратьРеквизитОбъектаМетаданных(Реквизиты, ДополнительныеПараметры.ИмяТаблицы, Результат.Значение);
	
КонецПроцедуры

&НаКлиенте
Процедура ЗавершениеВыбораРеквизитаОбъектаМетаданных(Результат, ДополнительныеПараметры) Экспорт
	
	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;
	ДобавитьТипыРеквизитаВТаблицу(ДополнительныеПараметры.ИмяТаблицы, Результат.Значение);
	
КонецПроцедуры

&НаСервере
Функция РеквизитыОбъектаМетаданных(ИмяОбъекта)
	
	Результат = Новый СписокЗначений;
	МетаданныеОбъекта = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ИмяОбъекта);
	ПолноеИмяОбъекта = МетаданныеОбъекта.ПолноеИмя();
	ЕщеРеквизитыОбъекта = Новый Структура("СтандартныеРеквизиты, Измерения, Ресурсы, Реквизиты");
	
	ЕдЧ = Новый Соответствие;
	ЕдЧ.Вставить("СтандартныеРеквизиты", "СтандартныйРеквизит");
	ЕдЧ.Вставить("Измерения", "Измерение");
	ЕдЧ.Вставить("Ресурсы", "Ресурс");
	ЕдЧ.Вставить("Реквизиты", "Реквизит");
	ЗаполнитьЗначенияСвойств(ЕщеРеквизитыОбъекта, МетаданныеОбъекта);
	Для Каждого Коллекция Из ЕщеРеквизитыОбъекта Цикл
		
		Если Коллекция.Значение = Неопределено Тогда
			Продолжить;
		КонецЕсли;
		
		Для Каждого Реквизит Из Коллекция.Значение Цикл
			ПолноеИмяРеквизита = ПолноеИмяОбъекта + "." + ЕдЧ[Коллекция.Ключ];
			// переберем типы реквизита
			Для Каждого Тип Из Реквизит.Тип.Типы() Цикл
				// если есть хоть один ссылочный
				Если ОбщегоНазначения.ЭтоСсылка(Тип) Тогда // добавим его в список
					ПолноеИмяРеквизита = ПолноеИмяРеквизита + "." + Реквизит.Имя;
					Результат.Добавить(ПолноеИмяРеквизита, Реквизит.Имя);
					Прервать;
				КонецЕсли;
			КонецЦикла;
		КонецЦикла;
		
	КонецЦикла;
	Результат.СортироватьПоПредставлению();
	Возврат Результат;
	
КонецФункции

&НаСервере
Процедура ДобавитьТипыРеквизитаВТаблицу(ИмяТаблицы, ПолноеИмяРеквизита)
	
	Реквизит = Метаданные.НайтиПоПолномуИмени(ПолноеИмяРеквизита);
	Если СтрНайти(ПолноеИмяРеквизита, "СтандартныйРеквизит") > 0 Тогда
		Имена = СтрРазделить(ПолноеИмяРеквизита, ".");
		Реквизит = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(Имена[0]+ "." + Имена[1]).СтандартныеРеквизиты[Имена[3]];
	КонецЕсли;
	
	Если Реквизит = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Таблица = Объект[ИмяТаблицы].Выгрузить();
	Для Каждого Тип Из Реквизит.Тип.Типы() Цикл
		ИмяОбъекта = СтрЗаменить(ОбщегоНазначения.СтроковоеПредставлениеТипа(Тип),"Ссылка","");
		НоваяСтрока = Таблица.Добавить(); // СтрокаТаблицыЗначений - 
		НоваяСтрока.Ссылка = Объект.ОбработчикиОбновления[0].Ссылка;
		НоваяСтрока.ОбъектМетаданных = ИмяОбъекта;
		НоваяСтрока.ИндексКартинки = ИндексКартинки(ИмяОбъекта);
		Если ИмяТаблицы <> "БлокируемыеОбъекты" Тогда
			НоваяСтрока.БлокироватьИнтерфейс = ИмяТаблицы = "ИзменяемыеОбъекты";
		КонецЕсли;
		Модифицированность = Истина;
	КонецЦикла;
	ГруппировкаОбъектов = "Ссылка,ОбъектМетаданных,ИндексКартинки,БлокироватьИнтерфейс";
	Если ИмяТаблицы = "ИзменяемыеОбъекты" Тогда
		ГруппировкаОбъектов = ГруппировкаОбъектов +",НовыеОбъекты";
	ИначеЕсли ИмяТаблицы = "БлокируемыеОбъекты" Тогда
		ГруппировкаОбъектов = "Ссылка,ОбъектМетаданных,ИндексКартинки";
	КонецЕсли;
	Таблица.Свернуть(ГруппировкаОбъектов);
	Таблица.Сортировать("ОбъектМетаданных");
	Объект[ИмяТаблицы].Загрузить(Таблица);
	
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьОбъектыВТаблицу(ИмяТаблицы, СтрокиОбъектов)
	
	Таблица = Объект[ИмяТаблицы];
	Для Каждого СтрокаОбъекта Из СтрокиОбъектов Цикл
		
		Отбор = Новый Структура("ОбъектМетаданных", СтрокаОбъекта.ОбъектМетаданных);
		НайденныеСтроки = Таблица.НайтиСтроки(Отбор);
		Если НайденныеСтроки.Количество() > 0 Тогда
			Продолжить;
		КонецЕсли;
		
		ТабличнаяЧасть = Объект[ИмяТаблицы]; // ТабличнаяЧасть - 
		НовыйОбъект = ТабличнаяЧасть.Добавить();
		ЗаполнитьЗначенияСвойств(НовыйОбъект, СтрокаОбъекта);
		НовыйОбъект.БлокироватьИнтерфейс = ИмяТаблицы = "ИзменяемыеОбъекты";
		
	КонецЦикла;
	Модифицированность = Истина;
	
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьОбщиеМодули()
	
	Таблица = РеквизитФормыВЗначение("ОбщиеМодули");
	Для Каждого Модуль Из Метаданные.ОбщиеМодули Цикл
		НоваяСтрока = Таблица.Добавить();
		НоваяСтрока.Имя = Модуль.ПолноеИмя();
	КонецЦикла;
	ЗначениеВРеквизитФормы(Таблица, "ОбщиеМодули");
	
КонецПроцедуры

&НаКлиенте
Функция СтандартнаяПроцедураПроверки()
	
	Возврат "ОбновлениеИнформационнойБазы.ДанныеОбновленыНаНовуюВерсиюПрограммы";
	
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция ТекстПредупрежденияИзмененаПроцедураПроверки(Вопрос = Ложь)
	
	ТекстШапка = НСтр("ru = 'Использование своей процедуры проверки, отличной от стандартной, допустимо
		|только в крайних случаях, когда ее возможностей недостаточно.'");
	ТекстШапка = СтрСоединить(СтрРазделить(ТекстШапка, Символы.ПС), " ");
	
	ТекстПродолжение = НСтр("ru = 'При этом необходимо соблюдать следующие правила при ее написании:
		| • обработчик может блокировать только не обновленные данные;
		| • данные должны разблокироваться по мере их обработки, а не после полной обработки всех объектов;
		| • ввод новых данных должен быть доступен всегда.'");
	
	ТекстПредупреждения = ТекстШапка + Символы.ПС + Символы.ПС + ТекстПродолжение;
	
	Если Вопрос Тогда
		ТекстПредупреждения = ТекстПредупреждения + Символы.ПС + Символы.ПС + НСтр("ru = 'Продолжить?'");
	КонецЕсли;
	
	Возврат ТекстПредупреждения;
	
КонецФункции

#КонецОбласти
